package CreationPattern.Prototype;

import java.util.Date;

/**
 * @Classname : DeepCopySheep
 * @Description : 深拷贝 —— 重写实现：clone()重写方法中同时对可变引用对象的成员变量进行拷贝
 * 原型模式
 * 一、模式定义
 *   Specify the kinds of objects to create using a prototypical instance, and create new objects by copying this prototype.
 *   （用原型实例指定创建对象的种类，并且通过拷贝这些原型创建新的对象。）
 *   理解：通过clone()创建对象，并进行调整
 *   优点：
 *     ① 性能好：二进制流拷贝性能远远优于new一个对象
 *     ② 逃避构造器约束：直接在堆内存中拷贝，不会执行构造器
 *   缺点：
 * 二、模式类图
 *   https://kdocs.cn/l/cb0iGx9NIW7O
 * 三、适用场景
 *   1、new一个对象需要消耗很多资源时
 *   2、new一个对象需要繁琐的数据准备或访问权限时
 *   3、当有多个修改者时，可考虑原型模式拷贝多个对象供调用者修改
 * 四、应用举例
 *
 * @Author : chentianyu
 * @Date 2023/1/23 21:01
 */

public class DeepCopySheep extends Sheep implements Cloneable {

    public DeepCopySheep(String name) {
        super(name);
    }

    @Override
    public DeepCopySheep clone() {
        try {
            DeepCopySheep clone = (DeepCopySheep) super.clone();
            // TODO: copy mutable state here, so the clone can't change the internals of the original
            // 因此如需深拷贝，则可变引用对象的成员变量不能使用 final 修饰符
            clone.setBirthday((Date) clone.getBirthday().clone());
            return clone;
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }

}
